/*
  Copyright 2019 the JSDoc Authors.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      https://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

import EventEmitter from 'node:events';

import { getLogFunctions } from '@jsdoc/util';

/**
 * Data about the environment in which JSDoc is running, including the configuration settings that
 * were used to run JSDoc.
 *
 * @alias module:@jsdoc/core.Env
 */
export default class Env {
  constructor() {
    /**
     * The command-line arguments passed to JSDoc.
     *
     * @type {Array<*>}
     */
    this.args = process.argv.slice(2);

    /**
     * The data parsed from JSDoc's configuration file.
     *
     * @type Object<string, *>
     */
    this.conf = {};

    /**
     * The event emitter shared across JSDoc.
     *
     * @type {node:events}
     */
    this.emitter = new EventEmitter();

    /**
     * Logging functions shared across JSDoc.
     *
     * @type {module:@jsdoc/util~logFunctions}
     */
    this.log = getLogFunctions(this.emitter);

    /**
     * The command-line arguments, expressed as key-value pairs.
     *
     * @type {Object<string, *>}
     */
    this.opts = {};

    /**
     * The times at which JSDoc started and finished.
     *
     * @type {Object}
     * @property {Date} start - The time at which JSDoc started running.
     * @property {?Date} finish - The time at which JSDoc finished running.
     */
    this.run = {
      start: new Date(),
      finish: null,
    };

    /**
     * The source files that JSDoc will parse.
     *
     * @type {Array<string>}
     */
    this.sourceFiles = [];

    /**
     * The dictionary of tags recognized by JSDoc.
     *
     * @type {module:@jsdoc/tags.Dictionary}
     */
    this.tags = null;

    /**
     * The JSDoc version number and revision date.
     *
     * @type {Object<string, string>}
     * @property {string} number - The JSDoc version number.
     * @property {string} revision - The JSDoc revision number, expressed as a UTC date string.
     */
    this.version = {
      number: null,
      revision: null,
    };
  }

  /**
   * The data parsed from JSDoc's configuration file.
   *
   * @type Object<string, *>
   */
  get config() {
    return this.conf;
  }

  /**
   * The command-line arguments, expressed as key-value pairs.
   *
   * @type {Object<string, *>}
   */
  get options() {
    return this.opts;
  }
}
